package com.example.demo;

import com.example.demo.service.AliPayService;
import com.example.demo.service.PayService;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: DELL
 * Date: 2023-05-31
 * Time: 17:46
 */
public class PayServiceJDKInvocationHandler implements InvocationHandler {

    // 目标对象即为被代理的对象
    private Object target; // 用 Object 通用

    // 构造方法, 传入目标对象
    public PayServiceJDKInvocationHandler(Object target) {
        this.target = target;
    }

    /**
     *
     * @param proxy 为代理对象
     * @param method 表示被调用的方法, 即代理的方法
     * @param args 表示方法的参数, 是一个数组. 如果方法有多个参数, 则数组中含所有参数的值. 没有则为空数组
     * @return 返回
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 重写 invoke 方法, 里面执行被代理对象调用的方法的具体实现

        // 登录检验
        System.out.println("登录检查");

        // 记录日志
        System.out.println("记录日志");

        // 记录开始时间
        System.out.println("记录开始时间");

        // 通过反射的手段调用被代理的方法
        Object retVal = method.invoke(target, args);

        // 记录结束时间
        System.out.println("记录结束时间");

        // 返回代理方法结果
        return retVal;
    }

    public static void main(String[] args) {
        PayService target = new AliPayService();

        // 调用方法处理器
        InvocationHandler handler = new PayServiceJDKInvocationHandler(target);
        PayService proxy = (PayService) Proxy.newProxyInstance(target.getClass().getClassLoader(),
                                                            new Class[]{PayService.class}, handler);

        proxy.pay();
    }
}
